package com.xbongbong.paas.domain.dao;

import com.xbongbong.paas.domain.entity.PaasMenuEntity;
import com.xbongbong.paas.domain.entity.ext.PaasMenuEntityExt;
import com.xbongbong.paas.toolbox.exception.XbbException;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

/**
 * @author: wufeng
 * @date: 2018/8/8 9:43
 * @desrcption:
 */
@Repository
@Mapper
public interface PaasMenuDao {

    /**
     * 插入新菜单
     * @author wufeng
     * @date 2018/8/8 9:44
     * @param entity 菜单对象
     * @descption
     * @return java.lang.Integer
     */
    Integer insert(PaasMenuEntity entity);

    /**
     * 更新菜单
     * @author wufeng
     * @date 2018/8/8 10:04
     * @param entity
     * @descption
     * @return java.lang.Integer
     */
    Integer update(PaasMenuEntity entity);

    /**
     * 删除实体
     * @author 吴峰
     * @date 2019/2/22 20:47
     * @param key 数据id
     * @param corpid 公司id
     * @return java.lang.Integer
     * @throws XbbException 业务异常
     */
    Integer deleteByKey(@Param("key") Long key, @Param("corpid") String corpid);
    /**
     * 获取实体
     * @author 吴峰
     * @date 2019/2/22 20:47
     * @param key 数据id
     * @param corpid 公司id
     * @return java.lang.Integer
     * @throws XbbException 业务异常
     */
    PaasMenuEntity getByKey(@Param("key") Long key, @Param("corpid") String corpid);
    /**
     * 查询实体列表
     * @author 吴峰
     * @date 2019/2/22 20:47
     * @param param 条件
     * @return java.lang.Integer
     * @throws XbbException 业务异常
     */
    List<PaasMenuEntity> findEntitys(@Param("param") Map<String, Object> param);
    /**
     * 查询实体数量
     * @author 吴峰
     * @date 2019/2/22 20:47
     * @param param 条件
     * @return java.lang.Integer
     * @throws XbbException 业务异常
     */
    Integer getEntitysCount(@Param("param") Map<String, Object> param);

    /**
     * 排序--批量操作
     * @author wufeng
     * @date 2018/8/7 14:09
     * @param paasAppEntityList
     * @param corpid 公司id
     * @descption
     * @return java.lang.Integer
     */
    Integer updateSort(@Param("list") List<PaasMenuEntity> paasAppEntityList, @Param("corpid") String corpid);

    /**
     * 菜单列表
     * @author wufeng
     * @date 2018/8/9 10:37
     * @param param
     * @descption
     * @return List<PaasMenuEntityExt>
     */
    List<PaasMenuEntityExt> getMenuList(@Param("param") Map<String, Object> param);

    /**
     * 检索当前公司的流程表单
     * @param param
     * @return
     */
    List<PaasMenuEntityExt> getAppProcessFormList(@Param("param") Map<String, Object> param);

    /**
     * 检索当前公司的各个引用的表单
     * @param param
     * @return
     */
    List<PaasMenuEntityExt> getAppFormList(@Param("param") Map<String, Object> param);

    /**
     * 检索当前应用的表单或者流程表单
     * @param param
     * @return List<PaasMenuEntityExt>
     */
    List<PaasMenuEntityExt> formList(@Param("param") Map<String,Object> param);
    /**
     * 检索当前公司的某个应用下可用的流程表单
     * @param map
     * @return
     * @throws XbbException 可能出现业务异常
     */
    List<PaasMenuEntityExt> getSomeAppProcessFormList(@Param("param") Map<String,Object> map);

    /**
     * 批量插入菜单
     * @param list
     */
    Integer insertBatch(@Param("list") List<PaasMenuEntity> list);
    /**
     * 根据应用id和业务标识获取实体
     * @param alias 业务标识
     * @param appId 应用id
     * @param corpid 公司id
     * @return 返回实体
     */
    PaasMenuEntity getByAlias(@Param("alias") String alias, @Param("appId") Long appId, @Param("corpid") String corpid);

    /**
     * 根据公司id和业务标识获取实体(经销商专用)
     * @param alias 业务标识
     * @param corpid 公司id
     * @param distributorMark 经销商标识
     * @return 返回实体
     */
    PaasMenuEntity getByAlias4Distributor(@Param("alias") String alias, @Param("corpid") String corpid, @Param("distributorMark") Integer distributorMark);

    /**
     * 批量更新
     * @param list
     */
    void updateBatch(@Param("list")List<PaasMenuEntity> list, @Param("corpid") String corpid);

    /**
     * 慎用！！！如果分库后则强制不能使用该方法！！！
     * 因为，该方法没有限制corpid（专门给资金管理改造一期使用：批量更新线上的一些已有菜单，如原回款管理改为应收款、原发票管理改为销项发票等）
     * 批量更新菜单：parentId、name、type（应收款与回款单分隔开，计划本身无流程）、updateTime
     * @param list 要更新的菜单list
     * @return java.lang.Integer
     * @author zcp
     * @date 19/11/4 004 19:41
     * @update 19/11/4 004 19:41
     * @since v1.0
     * @version v1.0
     */
    Integer updateBatchTemp(@Param("list") List<PaasMenuEntity> list);

    /**
     * 批量更新del字段
     * @param del
     * @param updateTime
     * @param idIn
     * @param corpid
     */
    void batchUpdateDel(@Param("del") Integer del, @Param("updateTime") Integer updateTime, @Param("idIn") List<Long> idIn, @Param("corpid") String corpid);

    Integer deleteBatch(@Param("idIn") List<Long> idIn, @Param("corpid") String corpid);

    Integer maxSortInSubMenu(@Param("corpid") String corpid, @Param("parentId") Long parentId, @Param("del") Integer del);

    Integer deleteByAlias(@Param("aliasIn") List<String> aliasIn,@Param("corpid")  String corpid);
}
